package com.cain.calendar.tool;

/**
 * Created by Cain on 2016/5/24.
 */

/**
 * 数字类，用来处理各种有关数字的计算
 */
public class Number {

    /**
     * 计算log_base(value)的值
     * @param base
     * @param value
     * @return
     */
    public static double log(double base, double value) {
        return Math.log(value) / Math.log(base);
    }

    /**
     * 找到最接近n的值为2^n的数
     * @param n
     * @return
     */
    public static int findCloser2nNumber(int n) {
        double exponent = log(2, n);
        int ahead = (int)Math.pow(2, (int)exponent);
        int next = (int)Math.pow(2, (int)exponent + 1);
        if (n - ahead < next - n) {
            return ahead;
        } else {
            return next;
        }
    }

    /**
     * 设备像素(dip,dp)转屏幕像素(px)
     * px就是像素，如果用px,就会用实际像素画，比个如吧，用画一条长度为240px的横线，在480宽的模拟器上看就是一半的屏宽，而在320宽的模拟器上看就是2／3的屏宽了。
     　　  * 而dip，就是把屏幕的高分成480分，宽分成320分。比如你做一条160dip的横线，无论你在320还480的模拟器上，都是一半屏的长度。
     * @param dipValue
     * @return
     */
    public static int dip2px(float dipValue){
        final float scale = MyApplication.getContext().getResources().getDisplayMetrics().density;
        return (int)(dipValue * scale + 0.5f);
    }

    /**
     * 将px值转换为sp值，保证文字大小不变
     *
     * @param pxValue
     *      （DisplayMetrics类中属性scaledDensity）
     * @return
     */
    public static int px2sp(float pxValue) {
        final float fontScale = MyApplication.getContext().getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 将sp值转换为px值，保证文字大小不变
     *
     * @param spValue
     *      （DisplayMetrics类中属性scaledDensity）
     * @return
     */
    public static int sp2px(float spValue) {
        final float fontScale = MyApplication.getContext().getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }
}
